/*题目：
 * 小明家新开了一家自行车工厂，用于使用自行车配件（车架 frame 和车轮 tires ）进行组装定制不同的自行车，包括山地车和公路车。
    山地车使用的是Aluminum Frame（铝制车架）和 Knobby Tires（可抓地轮胎），
    公路车使用的是 Carbon Frame （碳车架）和 Slim Tires。
 *  现在它收到了一笔订单，要求定制一批自行车，请你使用【建造者模式】告诉小明这笔订单需要使用那些自行车配置吧。
 * 输入：输入的第一行是一个整数 N（1 ≤ N ≤ 100），表示订单的数量。
        接下来的 N 行，每行输入一个字符串，字符串表示客户的自行车需求。
        字符串可以包含关键词 "mountain" 或 "road"，表示客户需要山地自行车或公路自行车。
 * 输出：对于每笔订单，输出该订单定制的自行车配置。
 * 示例：
 *      输入：3
            mountain
            road
            mountain
        输出：Aluminum Frame Knobby Tires
            Carbon Frame Slim Tires
            Aluminum Frame Knobby Tires
 * */

#include <iostream>
#include <vector>
using namespace std;

//自行车产品
class Bike{
public:
    string frame;
    string tires;

    void setFrame(const string& frame){
        this->frame=frame;
    }
    void setTires(const string& tires){
        this->tires=tires;
    }

    friend ostream& operator<<(ostream& os,const Bike& bike){
        os<<bike.frame<<" "<<bike.tires;
        return os;
    }

};

//自行车建造者接口
class BikeBuilder{
public:
    virtual void buildFrame()=0;
    virtual void buildTires()=0;
    virtual Bike getResult()=0;
};

//山地自行车建造者
class MountainBikeBuilder:public BikeBuilder{
private:
    Bike bike;
public:
    void buildFrame() override{
        bike.setFrame("Aluminum Frame");
    }
    void buildTires() override{
        bike.setTires("Knobby Tires");
    }
    Bike getResult() override{
        return bike;
    }
};

//公路自行车建造者
class RoadBikeBuilder:public BikeBuilder{
private:
    Bike bike;
public:
    void buildFrame() override{
        bike.setFrame("Carbon Frame");
    }
    void buildTires() override{
        bike.setTires("Slim Tires");
    }
    Bike getResult() override{
        return bike;
    }
};

//指导者
class Director{
public:
    Bike construct(BikeBuilder& bikeBuilder){
        bikeBuilder.buildFrame();
        bikeBuilder.buildTires();
        return bikeBuilder.getResult();
    }
};

int main(){
    int num=0;
    cin>>num;

    Director director;

    for (int i = 0; i < num; ++i) {
        string bikeType="";
        cin>>bikeType;

        BikeBuilder* bikeBuilder;

        if (bikeType=="mountain")
            bikeBuilder=new MountainBikeBuilder();
        else
            bikeBuilder=new RoadBikeBuilder();

        Bike bike=director.construct(*bikeBuilder);
        cout<<bike<<endl;

        delete bikeBuilder;
    }
    return 0;
}